import java.util.HashMap;
import java.util.Map;

/**
 * 给你一个整数数组 nums 和一个整数 k ，请你统计并返回 该数组中和为 k 的子数组的个数 。
 */
public class Solution560 {

    public int subarraySum(int[] nums, int k) {
        /**
         * 1. 子数组是要连续的，k=sum(0,x) - sum(0.y)
         * 2. 累加的数组值作为 key 存入hashmap中
         * 3. 如果sum - k的值存在hashmap的key中，ans++
         * 4. 如果sum存在过，sum的value++
         */
        Map<Integer, Integer> map = new HashMap<>();

        int sum = 0;
        int ans = 0;

        //sum-k=0 也是满足子数组的
        map.put(0, 1);

        for (int num : nums) {
            sum += num;
            //k-sum(0,y)
            if (map.containsKey(sum - k))
                //有可能那个出现前某个数的和相等的情况
                ans += map.get(sum - k);
            //getOrDefault(key,default)
            //作用：如果存在相应的key则返回其对应的value，否则返回给定的默认值:0。
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return ans;
    }

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, -3, 5};
        int i = new Solution560().subarraySum(nums, 6);
        System.out.println(i);
    }
}
